/*
 * fifo.h
 *
 *  Created on: May 10, 2010
 *      Author: apetit
 */
#ifndef FIFO_H_
#define FIFO_H_
#define MAXFIFOSCANT  100
#define fifosize  500


typedef struct {
	void * memoryZone;
	int offSetToRead;
	int offSetToWrite;
/*
 * Alguna que otra huevada mas que seguro necesitaremos
 */
} fifo_implementation;

typedef struct {
	int fifo_id;
	char name[50];
	fifo_implementation fifo;
} fifos_table;

fifos_table fifo_table[MAXFIFOSCANT];


void printFifoTable(int a);

/*
 * si hay lugar en la tabla creo
 * creo un fifo_impl => offsets 0 y memoryZone = Malloc(fifosize * sizeof(char));
 * pongo el fifo en la tabla con un id autoincremental
 * y devuelvo ese id
 */
int makeFifo(char * file_name);

/*
 * Open fifo dado un nombre te da ese fd
 */
int openFifo(char * fifo_name);

/*
 * writeFifo
 * Hace un "memcpy"
 * de buff al fifo
 * algo as�
 * hacer la cuentita por si tiene que dar la vuelta (es decir que si oofsetToWrite > fifozise)
 * 	for(i = 0; i < nbytes; i++){
 * 		*(tablaDeFifos[where id=fd].fifo + offsetToWrite + i ) = buff[i];
 * 	}
 * 	offsetToWrite += i;
 * return bytesescritos o -1;
 *
 */
int writeFifo(int fd, void * buff,int nbytes );

/*
 * Read Fifo
 * analo al anterior pero en offsert to read
 * hay que valiadar si el proceso no entrega nada hasta que
 * offsetToRead <= offSetToWrite (hay q ver q esto sea atomico)
 * retorna bytes leidos o -1
 */
int readFifo(int fd, void * buff, int nbytes);

/*
 * closeFifo
 * donde estaba el fifo_id ponerlo en -1
 * no se me ocurre como hacer el free de la zona de memoria
 * deberia leer el codigo del malloc xD para ver como hacer la inversa
 */
int close (int fd);




#endif /* FIFO_H_ */
